
/**
 * @file main
 *
 */

/*********************
 *      INCLUDES
 *********************/
#define _DEFAULT_SOURCE /* needed for usleep() */
#include <stdlib.h>
#include <unistd.h>
#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/
#include <SDL2/SDL.h>
#include "lvgl/lvgl.h"
#include "lvgl/examples/lv_examples.h"
#include "lvgl/demos/lv_demos.h"
#include "lv_drivers/sdl/sdl.h"

/*********************
 *      DEFINES
 *********************/

/**********************
 *      TYPEDEFS
 **********************/

/**********************
 *  STATIC PROTOTYPES
 **********************/
static void hal_init(void);

/**********************
 *  STATIC VARIABLES
 **********************/

/**********************
 *      MACROS
 **********************/

/**********************
 *   GLOBAL FUNCTIONS
 **********************/

/*********************
 *      DEFINES
 *********************/

/**********************
 *      TYPEDEFS
 **********************/

/**********************
 *      VARIABLES
 **********************/

/**********************
 *  STATIC PROTOTYPES
 **********************/

/**********************
 *   GLOBAL FUNCTIONS
 **********************/

void demo1_label(){
    //1. 获取当前屏幕
    lv_obj_t* scr = lv_scr_act();
    //2. 创建要显示标签
    lv_obj_t* label = lv_label_create(scr);
    //3. 对显示标签进行一定的设置
    lv_label_set_text(label,"hello world"); 
    // LV_FONT_MONTSERRAT_48，没有set就找父类，找到了就用，没有就用默认字体
    lv_obj_set_style_text_font(label, &lv_font_montserrat_48, 0);
    //lv_obj_set_style_text_font(label,,0);


    lv_obj_t* label1 = lv_label_create(scr);
    //3. 对显示对象进行一定的设置
    lv_label_set_text(label1,"hello world");
    lv_obj_center(label1);
}

void demo2_label_chinese(){
    //1. 获取当前屏幕
    lv_obj_t* scr = lv_scr_act();
    //2. 创建要显示标签
    lv_obj_t* label = lv_label_create(scr);
    //3. 对显示标签进行一定的设置
    // lv_label_set_text(label,"庆历四年春，滕子京谪守巴陵郡。越明年，政通人和，百废具兴。乃重修岳阳楼，增其旧制，刻唐贤今人诗赋于其上。属予作文以记之予观夫巴陵胜状，在洞庭一湖。衔远山，吞长江，浩浩汤汤，横无际涯；朝晖夕阴，气象万千。此则岳阳楼之大观也。前人之述备矣。然则北通巫峡，南极潇湘，迁客骚人，多会于此，览物之情，得无异乎？ 若夫霪雨霏霏，连月不开，阴风怒号，浊浪排空；日星隐耀，山岳潜形；商旅不行，樯倾楫摧；薄暮冥冥，虎啸猿啼。登斯楼也，则有去国怀乡，忧谗畏讥，满目萧然，感极而悲者矣。至若春和景明，波澜不惊，上下天光，一碧万顷；沙鸥翔集，锦鳞游泳；岸芷汀兰，郁郁青青。而或长烟一空，皓月千里，浮光跃金，静影沉璧，渔歌互答，此乐何极！登斯楼也，则有心旷神怡，宠辱偕忘，把酒临风，其喜洋洋者矣。嗟夫！予尝求古仁人之心，或异二者之为，何哉？不以物喜，不以己悲；居庙堂之高则忧其民；处江湖之远则忧其君。是进亦忧，退亦忧。然则何时而乐耶？其必曰“先天下之忧而忧，后天下之乐而乐”乎。噫！微斯人，吾谁与归？时六年九月十五日。");
      
      // lv_label_set_text(label,"燕子去了，有再来的时候；杨柳枯了，有再青的时候；桃花谢了，有再开的时候。但是，聪明的，你告诉我，我们的日子为什么一去不复返呢？——是有人偷了他们罢：那是谁？又藏在何处呢？是他们自己逃走了罢：现在又到了哪里呢？我不知道他们给了我多少日子；但我的手确乎是渐渐空虚了。在默默里算着，八千多日子已经从我手中溜去；像针尖上一滴水滴在大海里，我的日子滴在时间的流里，没有声音，也没有影子。我不禁头涔涔而泪潸潸了。去的尽管去了，来的尽管来着；去来的中间，又怎样地匆匆呢？早上我起来的时候，小屋里射进两三方斜斜的太阳。太阳他有脚啊，轻轻悄悄地挪移了；我也茫茫然跟着旋转。于是——洗手的时候，日子从水盆里过去；吃饭的时候，日子从饭碗里过去；默默时，便从凝然的双眼前过去。我觉察他去的匆匆了，伸出手遮挽时，他又从遮挽着的手边过去，天黑时，我躺在床上，他便伶伶俐俐地从我身上跨过，从我脚边飞去了。等我睁开眼和太阳再见，这算又溜走了一日。我掩着面叹息。但是新来的日子的影儿又开始在叹息里闪过了。在逃去如飞的日子里，在千门万户的世界里的我能做些什么呢？只有徘徊罢了，只有匆匆罢了；在八千多日的匆匆里，除徘徊外，又剩些什么呢？过去的日子如轻烟，被微风吹散了，如薄雾，被初阳蒸融了；我留着些什么痕迹呢？我何曾留着像游丝样的痕迹呢？我赤裸裸来到这世界，转眼间也将赤裸裸的回去罢？但不能平的，为什么偏要白白走这一遭啊？你聪明的，告诉我，我们的日子为什么一去不复返呢？");//zh
      // lv_label_set_text(label,"战争完整版曲:周杰伦词:mc仁陈少琪陈奂仁唱:陈冠希 hananjin mc仁胡蓓蔚战争是我的首部作品,希望大嘎瞎!打我而家就去打仗打属于我自己的一场仗假若显示世界根本就系一个战场这一切现象就像一对残酷假象假如现实要我去打一场假仗打住乜野旗号打一场点样既仗打得吾好我既生命就此划上句号问得吾好我应、该问生命一个乜野问号");//zh
      // lv_label_set_text(label,"如果说你是海上的烟火我是浪花的泡沫某一刻你的光照亮了我如果说你是遥远的星河耀眼得让人想哭我是追逐着你的眼眸总在孤单时候眺望夜空我可以跟在你身后像影子追着光梦游我可以等在这路口不管你会不会经过每当我为你抬起头连眼泪都觉得自由有的爱像阳光倾落边拥有边失去着如果说你是夏夜的萤火孩子们为你唱歌 那么我是想要画你的手你看我多么渺小一个我因为你有梦可做也许你不会为我停留那就让我站在你的背后我可以跟在你身后像影子追着光梦游我可以等在这路口不管你会不会经过每当我为你抬起头眼泪都觉得自由有的爱像大雨滂沱却依然相信彩虹我可以跟在你身后像影子追着光梦游我可以等在这路口不管你会不会经过每当我为你抬起头连眼泪都觉得自由有的爱像大雨滂沱却依然相信彩虹");//zh
      // lv_label_set_text(label,"看着飞舞的尘埃 掉下来没人发现它存在多自由自在可世界都爱热热闹闹容不下 我百无聊赖不应该 一个人 发呆只有我 守着安静的沙漠等待着花开只有我 看着别人的快乐竟然会感慨就让我 听着天大的道理不愿意明白有什么 是应该 不应该我的心里住着一个 苍老的小孩如果世界听不明白 对影子表白是不是只有我 还在问为什么 明天更精彩烟火里 找不到 童真的残骸只有我 守着安静的沙漠等待着花开只有我 看着别人的快乐竟然会感慨就让我 听着天大的道理不愿意明白只有我 就是我 好奇怪还在感慨风阵阵吹过来 为何不回来风一去不回来 悲不悲哀麻木得那么快 应不应能不能慢下来笑得开怀 哭得坦率为何表情 要让这世界安排我就是我 我只是我只是一场烟火散落的尘埃风阵阵吹过来风一去不回来能不能慢下来");//zh
     lv_label_set_text(label,"离别开出花，烟火里的尘埃，今天是个好日子，我想你。幻昼，夜的钢琴曲5，today is good day");//en 

 
    // LV_FONT_MONTSERRAT_48，没有set就找父类，找到了就用，没有就用默认字体
    // lv_obj_set_style_text_font(label, &lv_font_montserrat_48, 0);

    LV_FONT_DECLARE(alimamaaaa);
    lv_obj_set_style_text_font(label, &alimamaaaa, 0);
    //lv_obj_set_style_text_font(label,,0);
}

int main(int argc, char **argv)
{
  (void)argc; /*Unused*/
  (void)argv; /*Unused*/

  /*Initialize LVGL*/
  lv_init();

  /*Initialize the HAL (display, input devices, tick) for LVGL*/
  hal_init();

//  lv_example_switch_1();
//  lv_example_calendar_1();
//  lv_example_btnmatrix_2();
//  lv_example_checkbox_1();
//  lv_example_colorwheel_1();
//  lv_example_chart_6();
//  lv_example_table_2();
//  lv_example_scroll_2();
//  lv_example_textarea_1();
//  lv_example_msgbox_1();
//  lv_example_dropdown_2();
//  lv_example_btn_1();
//  lv_example_scroll_1();
//  lv_example_tabview_1();
//  lv_example_tabview_1();
//  lv_example_flex_3();
//  lv_example_label_1();

    // lv_demo_widgets();
    demo2_label_chinese();


  while(1) {
      /* Periodically call the lv_task handler.
       * It could be done in a timer interrupt or an OS task too.*/
      lv_timer_handler();
      usleep(5 * 1000);
  }

  return 0;
}

/**********************
 *   STATIC FUNCTIONS
 **********************/

/**
 * Initialize the Hardware Abstraction Layer (HAL) for the LVGL graphics
 * library
 */
static void hal_init(void)
{
  /* Use the 'monitor' driver which creates window on PC's monitor to simulate a display*/
  sdl_init();

  /*Create a display buffer*/
  static lv_disp_draw_buf_t disp_buf1;
  static lv_color_t buf1_1[SDL_HOR_RES * 100];
  lv_disp_draw_buf_init(&disp_buf1, buf1_1, NULL, SDL_HOR_RES * 100);

  /*Create a display*/
  static lv_disp_drv_t disp_drv;
  lv_disp_drv_init(&disp_drv); /*Basic initialization*/
  disp_drv.draw_buf = &disp_buf1;
  disp_drv.flush_cb = sdl_display_flush;
  disp_drv.hor_res = SDL_HOR_RES;
  disp_drv.ver_res = SDL_VER_RES;

  lv_disp_t * disp = lv_disp_drv_register(&disp_drv);

  lv_theme_t * th = lv_theme_default_init(disp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), LV_THEME_DEFAULT_DARK, LV_FONT_DEFAULT);
  lv_disp_set_theme(disp, th);

  lv_group_t * g = lv_group_create();
  lv_group_set_default(g);

  /* Add the mouse as input device
   * Use the 'mouse' driver which reads the PC's mouse*/
  static lv_indev_drv_t indev_drv_1;
  lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/
  indev_drv_1.type = LV_INDEV_TYPE_POINTER;

  /*This function will be called periodically (by the library) to get the mouse position and state*/
  indev_drv_1.read_cb = sdl_mouse_read;
  lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1);

  static lv_indev_drv_t indev_drv_2;
  lv_indev_drv_init(&indev_drv_2); /*Basic initialization*/
  indev_drv_2.type = LV_INDEV_TYPE_KEYPAD;
  indev_drv_2.read_cb = sdl_keyboard_read;
  lv_indev_t *kb_indev = lv_indev_drv_register(&indev_drv_2);
  lv_indev_set_group(kb_indev, g);

  static lv_indev_drv_t indev_drv_3;
  lv_indev_drv_init(&indev_drv_3); /*Basic initialization*/
  indev_drv_3.type = LV_INDEV_TYPE_ENCODER;
  indev_drv_3.read_cb = sdl_mousewheel_read;
  lv_indev_t * enc_indev = lv_indev_drv_register(&indev_drv_3);
  lv_indev_set_group(enc_indev, g);

  /*Set a cursor for the mouse*/
  LV_IMG_DECLARE(mouse_cursor_icon); /*Declare the image file.*/
  lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */
  lv_img_set_src(cursor_obj, &mouse_cursor_icon);           /*Set the image source*/
  lv_indev_set_cursor(mouse_indev, cursor_obj);             /*Connect the image  object to the driver*/
}
